package com.waves.spring.aop.aspect;

import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;

public class Target1 implements JdkService {
    @Override
    public void eat() {
        System.out.println("我要吃");
    }

    @Override
    public void drink() {
        System.out.println("我要喝");
    }

    public static void main(String[] args) {
        /*
         * 两个切面概念：
         *  aspect =
         *          通知 1 （advice） + 切点 1（pointcut）
         *          通知 2 （advice） + 切点 2（pointcut）
         *          通知 3 （advice） + 切点 3（pointcut）
         *          ...
         *
         * advisor = 更细粒度的切面，包含一个通知和切点
         * */

        // 1. 备好切点（根据 AspectJ 表达式进行匹配）
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("execution(* eat())");
        // 2. 备好通知
        MethodInterceptor advice = invocation -> {
            System.out.println("before...");
            Object result = invocation.proceed();
            System.out.println("after...");
            return result;
        };
        // 3. 备好切面
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
        // 4. 创建代理
        Target1 target = new Target1();
        ProxyFactory factory = new ProxyFactory();
        factory.setTarget(target);
        factory.addAdvisor(advisor);
//        factory.setProxyTargetClass(true);
        factory.setInterfaces(target.getClass().getInterfaces());
        JdkService proxy = (JdkService) factory.getProxy();
        System.out.println(proxy.getClass());
        proxy.eat();
        proxy.drink();
    }
}
